package thread;

import conn.SocketManager;

import java.io.BufferedWriter;
import java.io.IOException;

/**
 * Thread per il controllo dell'output del client verso dal server.
 *
 * @author Claudio "Dna" Bonesana
 */
public class OutputThread extends Thread {

    private SocketManager socketManager;
    private BufferedWriter bufferedWriter;

    private volatile boolean working;

    /**
     *  Crea un nuovo {@link OutputThread}. Prima di eseguirlo occorre associare il {@link SocketManager} che controllerà
     *  questo Thread e il {@link java.io.BufferedWriter} su cui andrà a scrivere i dati per il server.
     */
    public OutputThread() {
        this.working = true;
    }

    /**
     * @param socketManager un {@link SocketManager} valido
     */
    public void setSocketManager(SocketManager socketManager) {
        this.socketManager = socketManager;
    }

    /**
     * @param bufferedWriter    un {@link BufferedWriter} valido
     */
    public void setBufferedWriter(BufferedWriter bufferedWriter) {
        this.bufferedWriter = bufferedWriter;
    }

    /**
     * Termina in sicurezza il Thread.
     */
    public synchronized void stopThread(){
        working = false;
        this.interrupt();
    }

    /**
     * La thread va a recuperare i messaggi dal {@link SocketManager} e li scrive sul canale per il server. Nel caso in
     * cui non ci siano più messaggi, semplicemente attende.
     */
    @Override
    public void run() {
        while (working){
            try {
                String message = socketManager.getMessages().take();    /*  bloccante */
                bufferedWriter.write(message);
                bufferedWriter.flush();

            } catch (InterruptedException ignored) {
            } catch (IOException ignored) {
            }
        }
        try {
            bufferedWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
